package com.kobeliu.entity;

/**
 * 剑指 65
 *
 * 不用运算符 做加减乘除
 *
 */

public class Demo_59_sword_65 {

    public static void main(String[] args) {

//        int n = 1;
//        int m = 1;
//
//        Integer n1 = 1;
//        Integer m1 = 1;
//
//        Integer n2 = 100;
//        Integer m2 = 100;
//
//        //-128 ~ 127 在常量池 都是一样的
//        System.out.println(m2.equals(n2));//equals 比较值
//        System.out.println(m2==n2); //== 比较地址

        System.out.println(myPow(2.0000,10));



    }

    /**
     * 先比较两个位 不同的值 组合起来  0000 1101 和 0000 0001 即 0000 1100 ==> 12
     * 再比较两个位都是1的 a&b 左移一位 后面补0  即 (a&b)<<1
     * @param a
     * @param b
     * @return
     */
    private static Integer addNum(int a, int b) {

        if(b==0) return a;
        int c = a^b;
        int d = (a&b)<<1;
        return addNum(c,d);
    }

    /**
     * 返回 x^n
     * 常规乘法是 o（n）
     * 使用快速幂的思想
     * 比如 n = 7 ==>0111
     * 推出 x^7 ==> x^(2^2+2^1+2^0) 复杂度就降到了O(logn)
     * @param x
     * @param n
     * @return
     */
    public static double myPow(double x, int n) {

        if(n==0) return 1;
        if(n==1) return x;
        if(n==-1) return 1/x;
        double half = myPow(x,n/2);
        double mod = myPow(x,n%2);
        return half*half*mod;

    }
}
